
package classes;

import java.awt.Polygon;
import java.awt.Point;


//tale algoritmo implementa l'interfaccia Algorithm
public class ConvexPolygonsExtreme implements Algorithm {
    
    //paramentro che mi dice se i poligoni sono convessi o meno
    boolean convesso=true;
    
    
    //metodo per estrarre convex
    public boolean getConvex(){return convesso;}
    
    
    
    //implementazione vera e propria dell'algoritmo, prende un Data in ingresso
    public Data execute(Data d) {
        
        
        //oggetto di tipo Data da fornire come risultato
        Data result = new Data();
        
        //creo un poligono vuoto (uso la classe java presistente) e gli passo i punti del poligono in input prelevandoli da d (DataIn input)
        Polygon poligono1=new Polygon();
        poligono1=(Polygon) d.getShapes().get(0);

        
        //estraggo i vettori di punti per entrambe le coordinate
        int[] x = poligono1.xpoints;
        int[] y = poligono1.ypoints;
           
        //estraggo il numero di vertici del poligono
        int dim1=poligono1.npoints;
  
        //------inizio fase rappresentazione poligoni come VertexList
        //VertexList è una struttura dati più consona a gestire i poligoni per problemi di geometria computazionale
        //riempio il VertexList con i punti dei poligoni 
        
        VertexList cvert=new VertexList();
    
 
        for (int i=0; i < dim1; i++) {   
            Vertex vert=new Vertex();
            vert.v.x=x[i];
            vert.v.y=y[i];
            cvert.InsertBeforeHead(vert);
     
       }
      

            System.out.println("Poligono 1");  
            Vertex vert=new Vertex();
            vert=cvert.head;
            for (int i=0; i < dim1; i++) {   
            System.out.println("punto "+i+" ("+vert.v.x+","+vert.v.y+")"); 
            vert=vert.next;
            }
        
            
             
                
        //creo un istanza della classe Core che contiene tutti metodi utili al problema 
        Core convex= new Core();
        
             
        //lancio il metodo Start che prende la VertexList e restituisce un true se tutto è andato a buon fine        
        Boolean bool=convex.Start(cvert);
      
                
                //se il poligoni non è convesso ritorniamo subito result 
                if (!convex.convex) {
                this.convesso=false;
                return result;
                }
    
        
        //ris è un VertexList che rappresenta il poligono risultato
        //estraggo i punti da esso e li metto in result
       
            int cord_x=convex.ris.GetElement(0).v.x;
            int cord_y=convex.ris.GetElement(0).v.y;
            Point punto= new Point(cord_x,cord_y);
          
            result.getPoints().add(punto);
            return result;
        
    }
    
}
